import React, { useReducer, useState, useEffect } from "react";
import {http} from 'cess-core'

/**
 * immediate 表示是否立即发起网络请求
 * types 分别表示 http 请求中，请求成功，请求失败的 action.type
 */
export const useHttp = ({immediate, types, dispatch, config}) => {

	//http 请求信息
	const [configState, setConfig] = useState(config);

	//表示是否正在加载数据
	const [loading, setLoading] = useState(false);

	//如果请求发生错误，存储错误信息
	const [error, setError] = useState();

	//http 请求成功后返回的数据
	const [data, setData] = useState(null);

	//表示当前更新是否请求 http 数据，默认为 true ，当不需要页面更新时就发起 http ，则设为 false 即可
	//一定要用 useState 存储数据，用局部变量不能达到效果
	const [isFetchData, setIsFetchData] = useState(immediate != false);

	//当前页面刷新时执行
	useEffect(() => {

		//异步函数一定要采用这种方式，userEffect 不支持直接使用异步函数
		//或者使用 Promise 实现
		const fetchData = async () => {
			//清空请求错误信息
			setError(undefined);
			setLoading(true);
			try {
				//发起 http 请求
				const result = await http(configState);
				//设置结果
				setData(result);
			} catch (error) {
				//请求请求错误信息
				setError(error);
			}
			setLoading(false);
		};

		if(isFetchData){
			fetchData();
		}
	}, [configState]);


	var httpFun = (config)=>{
		setIsFetchData(true);
		setConfig(config)
	}

	//返回：请求结果、是否正在加载数据、请求的错误信息、发起 http 请求方法
	return { data, loading, error, http:httpFun};
}